package ewan.android.droidjockey;

import android.content.ComponentName;
import android.media.AudioManager;
import android.util.Log;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * Class that assists with handling new media button APIs available in API level
 * 8.
 */
public class MediaButtonHelper {
	// Backwards compatibility code (methods available as of API Level 8)
	private static final String TAG = "MediaButtonHelper";

	static {
		initializeStaticCompatMethods();
	}

	static Method sMethodRegisterMediaButtonEventReceiver;
	static Method sMethodUnregisterMediaButtonEventReceiver;

	static void initializeStaticCompatMethods() {
		try {
			sMethodRegisterMediaButtonEventReceiver = AudioManager.class
					.getMethod("registerMediaButtonEventReceiver",
							new Class[] { ComponentName.class });
			sMethodUnregisterMediaButtonEventReceiver = AudioManager.class
					.getMethod("unregisterMediaButtonEventReceiver",
							new Class[] { ComponentName.class });
		} catch (NoSuchMethodException e) {
			// Silently fail when running on an OS before API level 8.
		}
	}

	public static void registerMediaButtonEventReceiverCompat(
			AudioManager audioManager, ComponentName receiver) {
		if (sMethodRegisterMediaButtonEventReceiver == null)
			return;

		try {
			sMethodRegisterMediaButtonEventReceiver.invoke(audioManager,
					receiver);
		} catch (InvocationTargetException e) {
			// Unpack original exception when possible
			Throwable cause = e.getCause();
			if (cause instanceof RuntimeException) {
				throw (RuntimeException) cause;
			} else if (cause instanceof Error) {
				throw (Error) cause;
			} else {
				// Unexpected checked exception; wrap and re-throw
				throw new RuntimeException(e);
			}
		} catch (IllegalAccessException e) {
			Log.e(TAG,
					"IllegalAccessException invoking registerMediaButtonEventReceiver.");
			e.printStackTrace();
		}
	}

	public static void unregisterMediaButtonEventReceiverCompat(
			AudioManager audioManager, ComponentName receiver) {
		if (sMethodUnregisterMediaButtonEventReceiver == null)
			return;

		try {
			sMethodUnregisterMediaButtonEventReceiver.invoke(audioManager,
					receiver);
		} catch (InvocationTargetException e) {
			// Unpack original exception when possible
			Throwable cause = e.getCause();
			if (cause instanceof RuntimeException) {
				throw (RuntimeException) cause;
			} else if (cause instanceof Error) {
				throw (Error) cause;
			} else {
				// Unexpected checked exception; wrap and re-throw
				throw new RuntimeException(e);
			}
		} catch (IllegalAccessException e) {
			Log.e(TAG,
					"IllegalAccessException invoking unregisterMediaButtonEventReceiver.");
			e.printStackTrace();
		}
	}
}
